include conf.mk

.PHONY:all dirs clean help

DIRS=\
$(CPP_DIR) \
$(OBJ_DIR) \
$(BIN_DIR)

CLIENT_OBJS=\
$(OBJ_DIR)/client.o \
$(OBJ_DIR)/registry_map.o \
$(OBJ_DIR)/shm_pool.o \
$(OBJ_DIR)/shm_pool_buffer.o \
$(OBJ_DIR)/surface.o \
$(OBJ_DIR)/region.o \
$(OBJ_DIR)/shell_surface.o \
$(OBJ_DIR)/pointer.o \
$(OBJ_DIR)/keyboard.o

REGISTRY_OUTPUT_OBJS=\
$(OBJ_DIR)/dce.o \
$(OBJ_DIR)/layout_row.o \
$(OBJ_DIR)/registry_output.o

REGISTRY_OBJS=\
$(OBJ_DIR)/registry.o \
$(OBJ_DIR)/display.o \
$(OBJ_DIR)/shm.o \
$(OBJ_DIR)/compositor.o \
$(OBJ_DIR)/data_device_manager.o \
$(OBJ_DIR)/shell.o \
$(OBJ_DIR)/seat.o \
$(REGISTRY_OUTPUT_OBJS)

CFG_OBJS=\
$(OBJ_DIR)/cfg.o \
$(OBJ_DIR)/cfg_output.o \
$(OBJ_DIR)/cfg_output_layout.o \
$(OBJ_DIR)/cfg_output_match.o \
$(OBJ_DIR)/cfg_output_mode.o

WIRE_REGISTRY_OBJS=\
$(OBJ_DIR)/wl_display.o \
$(OBJ_DIR)/wl_compositor.o \
$(OBJ_DIR)/wl_registry.o \
$(OBJ_DIR)/wl_shm.o \
$(OBJ_DIR)/wl_data_device_manager.o \
$(OBJ_DIR)/wl_shell.o \
$(OBJ_DIR)/wl_seat.o \
$(OBJ_DIR)/wl_output.o

WIRE_CLIENT_OBJS=\
$(OBJ_DIR)/wl_callback.o \
$(OBJ_DIR)/wl_shm_pool.o \
$(OBJ_DIR)/wl_shm_pool_buffer.o \
$(OBJ_DIR)/wl_surface.o \
$(OBJ_DIR)/wl_region.o \
$(OBJ_DIR)/wl_shell_surface.o \
$(OBJ_DIR)/wl_pointer.o \
$(OBJ_DIR)/wl_keyboard.o

WIRE_OBJS=\
$(WIRE_REGISTRY_OBJS) \
$(WIRE_CLIENT_OBJS)

ULINUX_OBJS=\
$(OBJ_DIR)/args_env.o \
$(OBJ_DIR)/mem.o \
$(OBJ_DIR)/vsprintf.o \
$(OBJ_DIR)/decimal.o \
$(OBJ_DIR)/blk_decimal.o \
$(OBJ_DIR)/ulinux_match.o

OBJS=\
$(OBJ_DIR)/srv.o \
$(OBJ_DIR)/evdev.o \
$(OBJ_DIR)/udev.o \
$(CLIENT_OBJS) \
$(REGISTRY_OBJS) \
$(CFG_OBJS) \
$(WIRE_OBJS) \
$(ULINUX_OBJS)

#*******************************************************************************
#*******************************************************************************
help:
	@echo "targets are 'all', 'help'(this output), 'clean'"
	@echo -e "you can configure the build with the following variables:\\n\
	SYSROOT, ARCH, CPP, CC, LD, CPPFLAGS, CFLAGS, LDFLAGS...\\n\
	(you can tune the conf.mk file)"

all:dirs ../ulinux/arch $(BIN_DIR)/lwl

dirs:$(DIRS)
$(DIRS):
	-mkdir -p $@

../ulinux/arch:
	ln -s archs/$(ARCH) ../ulinux/arch

clean:
	-rm -f ../ulinux/arch
	-rm -Rf $(BUILD_DIR)
#*******************************************************************************

#*******************************************************************************
#ulinux objects
$(OBJ_DIR)/args_env.o:../ulinux/arch/args_env.s
	$(AS) $(ASFLAGS) $< -o $@

$(CPP_DIR)/mem.c:../ulinux/utils/mem.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/mem.o:$(CPP_DIR)/mem.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/vsprintf.c:../ulinux/utils/ascii/string/vsprintf.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/vsprintf.o:$(CPP_DIR)/vsprintf.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/decimal.c:../ulinux/utils/ascii/string/conv/decimal/decimal.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/decimal.o:$(CPP_DIR)/decimal.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/blk_decimal.c:../ulinux/utils/ascii/block/conv/decimal/decimal.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/blk_decimal.o:$(CPP_DIR)/blk_decimal.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/ulinux_match.c:../ulinux/utils/ascii/match/match.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/ulinux_match.o:$(CPP_DIR)/ulinux_match.c
	$(CC) $(CFLAGS) $< -o $@
#*******************************************************************************

$(CPP_DIR)/srv.c:srv.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/srv.o:$(CPP_DIR)/srv.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/udev.c:udev.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/udev.o:$(CPP_DIR)/udev.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/evdev.c:evdev.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/evdev.o:$(CPP_DIR)/evdev.c
	$(CC) $(CFLAGS) $< -o $@

#*******************************************************************************
#client objects
$(CPP_DIR)/client.c:client/client.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/client.o:$(CPP_DIR)/client.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/registry_map.c:client/registry_map.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/registry_map.o:$(CPP_DIR)/registry_map.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/shm_pool.c:client/shm_pool.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/shm_pool.o:$(CPP_DIR)/shm_pool.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/shm_pool_buffer.c:client/shm_pool_buffer.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/shm_pool_buffer.o:$(CPP_DIR)/shm_pool_buffer.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/surface.c:client/surface.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/surface.o:$(CPP_DIR)/surface.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/region.c:client/region.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/region.o:$(CPP_DIR)/region.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/shell_surface.c:client/shell_surface.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/shell_surface.o:$(CPP_DIR)/shell_surface.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/pointer.c:client/pointer.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/pointer.o:$(CPP_DIR)/pointer.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/keyboard.c:client/keyboard.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/keyboard.o:$(CPP_DIR)/keyboard.c
	$(CC) $(CFLAGS) $< -o $@
#*******************************************************************************

#*******************************************************************************
#registry objects
$(CPP_DIR)/registry.c:registry/registry.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/registry.o:$(CPP_DIR)/registry.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/display.c:registry/display.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/display.o:$(CPP_DIR)/display.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/shm.c:registry/shm.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/shm.o:$(CPP_DIR)/shm.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/compositor.c:registry/compositor.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/compositor.o:$(CPP_DIR)/compositor.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/data_device_manager.c:registry/data_device_manager.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/data_device_manager.o:$(CPP_DIR)/data_device_manager.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/shell.c:registry/shell.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/shell.o:$(CPP_DIR)/shell.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/seat.c:registry/seat.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/seat.o:$(CPP_DIR)/seat.c
	$(CC) $(CFLAGS) $< -o $@

#===============================================================================
#output registry objects
$(CPP_DIR)/dce.c:registry/output/dce.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/dce.o:$(CPP_DIR)/dce.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/layout_row.c:registry/output/layout_row.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/layout_row.o:$(CPP_DIR)/layout_row.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/registry_output.c:registry/output/output.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/registry_output.o:$(CPP_DIR)/registry_output.c
	$(CC) $(CFLAGS) $< -o $@
#===============================================================================
#*******************************************************************************

#*******************************************************************************
#cfg objects
$(CPP_DIR)/cfg.c:cfg/cfg.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/cfg.o:$(CPP_DIR)/cfg.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/cfg_output.c:cfg/output/output.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/cfg_output.o:$(CPP_DIR)/cfg_output.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/cfg_output_layout.c:cfg/output/layout.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/cfg_output_layout.o:$(CPP_DIR)/cfg_output_layout.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/cfg_output_match.c:cfg/output/match.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/cfg_output_match.o:$(CPP_DIR)/cfg_output_match.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/cfg_output_mode.c:cfg/output/mode.c 
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/cfg_output_mode.o:$(CPP_DIR)/cfg_output_mode.c
	$(CC) $(CFLAGS) $< -o $@
#*******************************************************************************

#*******************************************************************************
#wire objects
#===============================================================================
#wire registry objects
$(CPP_DIR)/wl_display.c:wire/registry/wl_display.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/wl_display.o:$(CPP_DIR)/wl_display.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/wl_compositor.c:wire/registry/wl_compositor.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/wl_compositor.o:$(CPP_DIR)/wl_compositor.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/wl_registry.c:wire/registry/wl_registry.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/wl_registry.o:$(CPP_DIR)/wl_registry.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/wl_shm.c:wire/registry/wl_shm.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/wl_shm.o:$(CPP_DIR)/wl_shm.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/wl_data_device_manager.c:wire/registry/wl_data_device_manager.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/wl_data_device_manager.o:$(CPP_DIR)/wl_data_device_manager.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/wl_shell.c:wire/registry/wl_shell.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/wl_shell.o:$(CPP_DIR)/wl_shell.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/wl_seat.c:wire/registry/wl_seat.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/wl_seat.o:$(CPP_DIR)/wl_seat.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/wl_output.c:wire/registry/wl_output.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/wl_output.o:$(CPP_DIR)/wl_output.c
	$(CC) $(CFLAGS) $< -o $@
#===============================================================================

#===============================================================================
#wire registry objects
$(CPP_DIR)/wl_callback.c:wire/client/wl_callback.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/wl_callback.o:$(CPP_DIR)/wl_callback.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/wl_shm_pool.c:wire/client/wl_shm_pool.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/wl_shm_pool.o:$(CPP_DIR)/wl_shm_pool.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/wl_shm_pool_buffer.c:wire/client/wl_shm_pool_buffer.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/wl_shm_pool_buffer.o:$(CPP_DIR)/wl_shm_pool_buffer.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/wl_surface.c:wire/client/wl_surface.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/wl_surface.o:$(CPP_DIR)/wl_surface.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/wl_region.c:wire/client/wl_region.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/wl_region.o:$(CPP_DIR)/wl_region.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/wl_shell_surface.c:wire/client/wl_shell_surface.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/wl_shell_surface.o:$(CPP_DIR)/wl_shell_surface.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/wl_pointer.c:wire/client/wl_pointer.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/wl_pointer.o:$(CPP_DIR)/wl_pointer.c
	$(CC) $(CFLAGS) $< -o $@

$(CPP_DIR)/wl_keyboard.c:wire/client/wl_keyboard.c
	$(CPP) $(CPPFLAGS) $< -o $@
$(OBJ_DIR)/wl_keyboard.o:$(CPP_DIR)/wl_keyboard.c
	$(CC) $(CFLAGS) $< -o $@
#===============================================================================
#*******************************************************************************

$(BIN_DIR)/lwl:$(OBJS)
	$(LD) $(LDFLAGS) $(OBJS) $$(pkg-config --libs libudev) -o $@
